/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package py.gestionpymes.bpm.service;

import java.util.Date;
import java.util.List;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import py.gestionpymes.bpm.persistencia.instancia.ActividadInstancia;
import py.gestionpymes.bpm.persistencia.instancia.ProcesoInstancia;
import py.gestionpymes.bpm.persistencia.modelo.Actividad;
import py.gestionpymes.bpm.persistencia.modelo.Estado;
import py.gestionpymes.bpm.persistencia.modelo.Proceso;

/**
 *
 * @author cromero
 */
@Stateless
public class ServicioBPM implements ServicioBPMLocal {

    @PersistenceContext
    private EntityManager em;

    @Override
    public void empezarProceso(final String nombre, String referencia) {
        Proceso p = null;
        try {
            p = (Proceso) em.
                    createQuery("SELECT p from Proceso p where p.nombre = ?1").
                    setParameter(1, nombre).
                    getSingleResult();

        } catch (Exception e) {
        }

        ProcesoInstancia pinstancia = new ProcesoInstancia();
        pinstancia.setProceso(p);

        Estado estadoinicial = null;
        for (Estado e : p.getEstados()) {
            if (e.isEstadoInicial()) {
                estadoinicial = e;
                break;
            }
        }

        pinstancia.setEstado(estadoinicial);

        pinstancia.setFecha(new Date());
        pinstancia.setReferencia(referencia);
        persist(pinstancia);

        Actividad actividadInicial = null;
        for (Actividad a : estadoinicial.getActividades()) {
            if (a.isPrimera()) {
                actividadInicial = a;
                break;
            }
        }

        ActividadInstancia ainstancia = new ActividadInstancia();
        ainstancia.setActividad(actividadInicial);
        ainstancia.setAutor(actividadInicial.getAutor());
        ainstancia.setFecha(new Date());
        ainstancia.setProcesoInstancia(pinstancia);
        persist(ainstancia);
    }

    @Override
    public List<ActividadInstancia> tareas() {
        return em.
                createQuery("SELECT a from ActividadInstancia a where a.cumplido = false;").
                getResultList();
    }
    
    @Override
    public List<ActividadInstancia> tareasCumplidas() {
        return em.
                createQuery("SELECT a from ActividadInstancia a where a.procesoInstancia.estado.estadoFinal = true;").
                getResultList();
    }

    @Override
    public void cumple(ActividadInstancia ainstancia) {


        Actividad actividadInicial = ainstancia.getActividad().getSalidaVerdadero();
        ProcesoInstancia pi = ainstancia.getProcesoInstancia();
        if (actividadInicial != null) {


            ActividadInstancia ainstanciaNueva = new ActividadInstancia();
            ainstanciaNueva.setActividad(actividadInicial);
            ainstanciaNueva.setAutor(actividadInicial.getAutor());
            ainstanciaNueva.setFecha(new Date());


            ainstanciaNueva.setProcesoInstancia(pi);
            persist(ainstanciaNueva);




            pi.setEstado(ainstanciaNueva.getActividad().getEstado());

        } else {
            Proceso p = pi.getProceso();
            Estado estadoFinal = null;
            for (Estado e : p.getEstados()) {
                if (e.isEstadoFinal()) {
                    estadoFinal = e;
                    break;
                }
            }

            pi.setEstado(estadoFinal);
        }

        ainstancia.setCumplido(true);
        em.merge(pi);
        em.merge(ainstancia);
    }

    
    
    public void persist(Object object) {
        em.persist(object);
    }
}
